#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->group_DL->setEnabled(false);
    ui->group_EB->setEnabled(false);

    auto offset=QDate::currentDate().day();
    ui->dBegin->setDate(QDate::currentDate().addDays(1 - offset));
    // ui->dEnd->setDate(QDate::currentDate());

    setWindowTitle(QString("发货单标记工具 - 版本 %1").arg(SP_VER));
    startAnalyzer();
}

Widget::~Widget()
{
    stopAnalyzer();
    delete ui;
}

void Widget::startAnalyzer()
{
    analyzer=new Analyzer;
    connect(analyzer,&Analyzer::appendMessage,this,&Widget::appendMessage);
    connect(analyzer,&Analyzer::connected,this,&Widget::onConnected);
    connect(analyzer,&Analyzer::analyzing,this,&Widget::onAnalyzing);

    connect(this,&Widget::odbc_connect,analyzer,&Analyzer::onConnect);

    connect(this,&Widget::analyze_DL,analyzer,&Analyzer::onAnalyze_DL);
    connect(this,&Widget::reset_DL,analyzer,&Analyzer::onReset_DL);
    connect(this,&Widget::test_DL,analyzer,&Analyzer::onTest_DL);

    connect(this,&Widget::analyze_EB,analyzer,&Analyzer::onAnalyze_EB);
    connect(this,&Widget::reset_EB,analyzer,&Analyzer::onReset_EB);
    connect(this,&Widget::test_EB,analyzer,&Analyzer::onTest_EB);

    connect(&analyzeThread,&QThread::finished,analyzer,&QObject::deleteLater);

    analyzer->moveToThread(&analyzeThread);
    analyzeThread.start();
}

void Widget::stopAnalyzer()
{
    analyzeThread.quit();
    analyzeThread.wait();
}

void Widget::appendMessage(const QString &message)
{
    ui->display->appendPlainText(message);
}

void Widget::onAnalyzing(bool flag)
{
    if(flag)
    {
        ui->btn_analyze_dl->setEnabled(false);
        ui->btn_analyze_eb->setEnabled(false);
    }
    else
    {
        ui->btn_analyze_dl->setEnabled(true);
        ui->btn_analyze_eb->setEnabled(true);
    }
}

void Widget::on_btn_connect_clicked()
{
    odbc_connect();
}

void Widget::onConnected(bool flag)
{
    if(flag)
    {
        appendMessage("数据库已连接，可以执行操作");
        ui->btn_connect->setEnabled(false);
        ui->group_DL->setEnabled(true);
        ui->group_EB->setEnabled(true);
    }
    else
    {
        appendMessage("数据库无法连接，请确保：\n\t"
"1、网络正常，可以访问0网段服务器;\n\t"
"2、ULogin正在运行；");
    }
}

bool Widget::checkDateRange()
{
    auto dBegin=ui->dBegin->date();
    // auto dEnd=ui->dEnd->date();

    auto dEnd=QDate::currentDate();

    if(dEnd.daysTo(dBegin) < -365)
    {
        appendMessage("输入错误，日期范围不要超过365天");
        return false;
    }

    if(dBegin.daysTo(dEnd) < 0)
    {
        appendMessage(QString("输入错误，开始日期必须小于等于当前日期 %1").arg(Today));
        return false;
    }

    beginDate=dBegin.toString(DATE_FORMAT);
    return true;
}

void Widget::on_btn_analyze_dl_clicked()
{
    if(checkDateRange())
        analyze_DL(beginDate);
}

void Widget::on_btn_clean_dl_clicked()
{
    auto result=QMessageBox::information(this,"操作确定","该操作会清除指定日期范围内的发货单标记，是否确定?",
                                         QMessageBox::Ok | QMessageBox::Cancel,
                                         QMessageBox::Cancel);
    if(result == QMessageBox::Ok && checkDateRange())
    {
        reset_DL(beginDate);
    }
}

void Widget::on_btn_test_dl_clicked()
{
    auto dlCode=QInputDialog::getText(this,"输入发货单号","发货单号").trimmed();
    if(dlCode.isEmpty())
        return;

    test_DL(dlCode);
}

void Widget::on_btn_analyze_eb_clicked()
{
    if(checkDateRange())
        analyze_EB(beginDate);
}

void Widget::on_btn_clean_eb_clicked()
{
    auto result=QMessageBox::information(this,"操作确定","该操作会清除指定日期范围内的电商订单标记，是否确定?",
                                         QMessageBox::Ok | QMessageBox::Cancel,
                                         QMessageBox::Cancel);
    if(result == QMessageBox::Ok && checkDateRange())
    {
        reset_EB(beginDate);
    }
}

void Widget::on_btn_test_eb_clicked()
{
    auto tid=QInputDialog::getText(this,"输入电商订单号","电商订单号").trimmed();
    if(tid.isEmpty())
        return;

    test_EB(tid);
}
